package com.cskaoyan._03classload;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/3 10:22
 **/
/*
什么是引用数据类型?
    按照我们之前说的: 引用 + 对象
    跟我们说的基本数据类型就已经割裂开来,没有什么联系了.
    换个角度:
        数据类型: 数据的集合+合法操作 类比一下类
        类:
            成员变量: 描述的不同对象的共有属性--->数据的集合
            成员方法: 描述的不同对象的共有行为--->操作的集合

        总结:
            自己定义的class类,表示我们自己定义了一种全新的数据类型,称之为自定义数据类型

        基本数据类型又称为java内置的数据类型,因为是内置数据类型,JVM知道其结构,大小等信息,直接使用
        因为JVM认识它.
        但是对于自己定义的class,JVM不认识,需要JVm认识自己写的类,认识的过程称为类加载

关于类加载：
1. 类加载的具体过程，我们后面会详细学习。这里我们先不用了解它的详细过程。
2. 类加载是通过把某个类的二进制字节码文件（class文件）通过I/O流的形式，(input,output)
    读取进JVM内存中的方法区实现的。
3. 通过读取二进制字节码文件，并加载进JVM内存, 并在内存中生成一个这个类所对应的字节码文件对象,
    这是JVM了解这个类型的过程。
4. 类加载之后，就可以做很多类型相关的操作了。
5. 类加载要在创建对象之前进行，换句话说创建一个类的对象必然触发该类的类加载！

注意:
    1.一个程序运行过程中,一个类只加载一次,如果该类已经加载了,下次就不再加载了
    2.类加载是"懒加载", 比较懒,不用的时候不加载,用到的时候再加载



类加载时机:
    1.执行main方法会触发类加载
    2.首次创建对象的时候会触发类加载


 */
// 执行main方法之前,先加载Demo类,因为main方法定义在Demo类里面的
public class Demo {
    public static void main(String[] args) {
        System.out.println("11111");


        // 创建Student对象之前要先加载Student类, 先认识"模板"
        // 创建Student对象

        Student student = new Student();

        // (首次)创建对象会触发类的加载,触发Student类的加载
        // 再次创建Student对象就不会触发类加载了,因为已经加载过了
        Student student2 = new Student();

        // 会触发Demo类的加载吗?--->不会,因为执行main之前已经加载过Demo类了
        Demo demo = new Demo();

    }
}


class Student{}